home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / allocwg.com / MALLOC.C < prev    next >
Encoding:
C/C++ Source or Header  |  1988-11-10  |  3.7 KB  |  114 lines

  1. #ifndef MSC
  2.  
  3.     /*  Non-MSC Version  */
  4.  
  5. #if (defined(M_I86CM) || defined(M_I86LM) || defined(M_I86HM))
  6.  
  7.     /*  NOTE:  These procedures should only be used for
  8.                large data model programs (i.e., Compact, Large, Huge) */
  9.  
  10. #include <stddef.h>
  11. #include "alloc.h"
  12.  
  13. ATABLE  AllocationTable [] =  {    /* Provide storage for block pointers */
  14.       0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL,
  15.       0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL,
  16.       0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL
  17. } ;
  18. SUNIT        TABLESIZE =  sizeof (AllocationTable) / sizeof (ATABLE) ;
  19. SUNIT        MBSize    =  1024  ;   /* Default allocation block size     */
  20. SUNIT        NEntry    =     0  ;   /* Number of table entries           */
  21. size_t       _amblksiz =  1024  ;   /* MSC equivalent of MBSize.         */
  22.                                     /* Included here to prevent loading  */
  23.                                     /* of unneeded MSC modules.          */
  24.  
  25. void *malloc ( nbytes )
  26.  
  27.    size_t      nbytes  ;        /* Number of bytes to allocate      */
  28.  
  29. /*
  30.          +---------------------------------------+
  31.          |                                       |  
  32.          |  Memory allocation procedure          |  
  33.          |                                       |  
  34.          +---------------------------------------+
  35. */
  36.  
  37. {
  38.    SUNIT   allocsize             ;
  39.    SUNIT   nu                    ;
  40.    SUNIT  *bptr                  ;
  41.    SUNIT  *FindBlock ()          ;
  42.    HEADER *AllocateBlock ()      ;
  43.    HEADER *Header                ;
  44.    void    NormalizeMBSize ()    ;
  45.    void    CollapseFreeBlocks () ;
  46.    int     i                     ;
  47.  
  48.       /*  Make sure allocation request is O.K.  */
  49.  
  50.    if ( nbytes == 0 )
  51.       return ( NULL ) ;
  52.  
  53.       /*  Calculate number of bytes needed.     */
  54.  
  55.    allocsize = SSIZE * (( nbytes - 1 ) / SSIZE  + 1 ) ;
  56.    if ( allocsize > MAXALLOC )
  57.       return ( NULL ) ;
  58.  
  59.        /*  Try to allocate memory from memory available first  */
  60.  
  61.    for ( i = 0 ; i < NEntry ; i++ ) {
  62.       CollapseFreeBlocks ( AllocationTable [i].Header ) ;
  63.       if ((bptr = FindBlock (AllocationTable [i].Header,allocsize)) != NULL)
  64.          return ( (void *) bptr ) ;
  65.    } ;
  66.  
  67.         /*  No block is available with enough space.  Make sure
  68.             allocation unit is correctly sized.   */
  69.  
  70.    NormalizeMBSize () ;
  71.  
  72.         /*  First try to expand the last block in memory if possible.  */
  73.  
  74.    if ( NEntry > 0 ) {
  75.       Header = AllocationTable [NEntry-1].Header ;
  76.       if ( ExpandBlock ( Header, allocsize )) {
  77.          AllocationTable [NEntry-1].Size = Header->BytesUsed ;
  78.          return ( (void *) FindBlock ( Header, allocsize ) ) ;
  79.       } ;
  80.    } ;
  81.       
  82.         /*  No luck.  Try to allocate another block.  */
  83.  
  84.    if ( NEntry == TABLESIZE )
  85.       return ( NULL ) ;
  86.    nu = MBSize * (( allocsize + HSIZE + SSIZE - 1 ) / MBSize + 1 ) ;
  87.    Header = AllocationTable [NEntry].Header = AllocateBlock ( nu ) ;
  88.    if ( Header == NULL )
  89.       return ( NULL ) ;
  90.  
  91.       /* Return allocated memory address  */
  92.  
  93.    AllocationTable [NEntry++].Size = Header->BytesUsed ;
  94.    return ( (void *) FindBlock ( Header, allocsize ) ) ;
  95. }
  96.  
  97. void far *_fmalloc ( nbytes )
  98.  
  99.    size_t       nbytes  ;        /* Number of bytes to allocate      */
  100.  
  101. /*
  102.          +---------------------------------------+
  103.          |                                       |  
  104.          |  Interface to malloc (large data)     |  
  105.          |                                       |  
  106.          +---------------------------------------+
  107. */
  108.  
  109. {
  110.    return ( (void far *) malloc ( nbytes ) ) ;
  111. }
  112. #endif
  113. #endif
  114.